<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
<!-- atomic-operations.qdoc -->
  <title>Implementing Atomic Operations | Qt 5.14</title>
  <link rel="stylesheet" type="text/css" href="style/offline-simple.css" />
  <script type="text/javascript">
    document.getElementsByTagName("link").item(0).setAttribute("href", "style/offline.css");
    // loading style sheet breaks anchors that were jumped to before
    // so force jumping to anchor again
    setTimeout(function() {
        var anchor = location.hash;
        // need to jump to different anchor first (e.g. none)
        location.hash = "#";
        setTimeout(function() {
            location.hash = anchor;
        }, 0);
    }, 0);
  </script>
</head>
<body>
<div class="header" id="qtdocheader">
  <div class="main">
    <div class="main-rounded">
      <div class="navigationbar">
        <table><tr>
<td ><a href="index.html">Qt 5.14</a></td><td >Implementing Atomic Operations</td></tr></table><table class="buildversion"><tr>
<td id="buildversion" width="100%" align="right">Qt 5.14.2 Reference Documentation</td>
        </tr></table>
      </div>
    </div>
<div class="content">
<div class="line">
<div class="content mainContent">
<div class="sidebar"><div class="sidebar-content" id="sidebar-content"></div></div>
<h1 class="title">Implementing Atomic Operations</h1>
<span class="subtitle"></span>
<!-- $$$atomic-operations.html-description -->
<div class="descr"> <a name="details"></a>
<p>Qt uses an optimization called <a href="../qtcore/implicit-sharing.html#implicitly-shared-classes">implicit sharing</a> for many of its value classes.</p>
<p>Starting with Qt 4, all of Qt's implicitly shared classes can safely be copied across threads like any other value classes, i.e&#x2e;, they are fully <a href="threads-reentrancy.html">reentrant</a>. This is accomplished by implementing reference counting operations using atomic hardware instructions on all the different platforms supported by Qt.</p>
<p>To support a new architecture, it is important to ensure that these platform-specific atomic operations are implemented in a corresponding header file (<code>qatomic_ARCH.h</code>), and that this file is located in Qt's <code>src/corelib/arch</code> directory. For example, the Intel 80386 implementation is located in <code>src/corelib/arch/qatomic_i386.h</code>.</p>
<p>Currently, Qt provides two classes providing several atomic operations, <a href="../qtcore/qatomicint.html">QAtomicInt</a> and <a href="../qtcore/qatomicpointer.html">QAtomicPointer</a>. These classes inherit from QBasicAtomicInt and <a href="../qtcore/qbasicatomicpointer.html">QBasicAtomicPointer</a>, respectively.</p>
<p>When porting Qt to a new architecture, the QBasicAtomicInt and <a href="../qtcore/qbasicatomicpointer.html">QBasicAtomicPointer</a> classes must be implemented, <i>not</i> <a href="../qtcore/qatomicint.html">QAtomicInt</a> and <a href="../qtcore/qatomicpointer.html">QAtomicPointer</a>. The former classes do not have constructors, which makes them POD (plain-old-data). Both classes only have a single member variable called <code>_q_value</code>, which stores the value. This is the value that all of the atomic operations read and modify.</p>
<p>All of the member functions mentioned in the <a href="../qtcore/qatomicint.html">QAtomicInt</a> and <a href="../qtcore/qatomicpointer.html">QAtomicPointer</a> API documentation must be implemented. Note that these the implementations of the atomic operations in these classes must be atomic with respect to both interrupts and multiple processors.</p>
<p><b>Warning:</b> The QBasicAtomicInt and <a href="../qtcore/qbasicatomicpointer.html">QBasicAtomicPointer</a> classes mentioned in this document are used internally by Qt and are not part of the public API. They may change in future versions of Qt. The purpose of this document is to aid people interested in porting Qt to a new architecture.</p>
</div>
<!-- @@@atomic-operations.html -->
        </div>
       </div>
   </div>
   </div>
</div>
<div class="footer">
   <p>
   <acronym title="Copyright">&copy;</acronym> 2020 The Qt Company Ltd.
   Documentation contributions included herein are the copyrights of
   their respective owners.<br/>    The documentation provided herein is licensed under the terms of the    <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation    License version 1.3</a> as published by the Free Software Foundation.<br/>    Qt and respective logos are trademarks of The Qt Company Ltd.     in Finland and/or other countries worldwide. All other trademarks are property
   of their respective owners. </p>
</div>
</body>
</html>
